home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 / Ham Radio 2000.iso / ham2000 / morse / staton / morse.txt < prev    next >
Text File  |  1994-04-21  |  8KB  |  404 lines

  1. ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!;
  2. ;   COPYRIGHT (C) 1994 KEN STATON    ;
  3. ;         ALL RIGHTS RESERVED        ;
  4. ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!;
  5.  
  6. ;
  7. ;*************************************************************************
  8. ;
  9. ;
  10. ; PLAY MORSE CHARACTER 
  11. ; INPUT: CHARACTER INDEX IN ACC
  12. ; MODIFIES REGISTERS: DPTR, ACC, R5/R6/R7 in SEND
  13. ; MODIFIES Variables: DUR
  14. ;
  15.  
  16. ; DECODE SIZE:
  17. ; IF BIT 7 CLR AND BIT 6 CLR, FIVE BITS (CHARACTER IS NUMBER OR PROSIGN)
  18. ; IF BIT 7 CLR AND BIT 6 SET, SIX BITS ( CHARACTER IS PUNCTUATION OR PROSIGN)
  19. ; IF BIT 7 SET (CHARACTER IS LETTER)
  20. ; THEN IF BIT 6 CLR AND BIT 5 CLR, ONE BIT
  21. ; THEN IF BIT 6 CLR AND BIT 5 SET, TWO BITS
  22. ; THEN IF BIT 6 SET AND BIT 5 CLR, THREE BITS
  23. ; THEN IF BIT 6 SET AND BIT 5 SET, FOUR BITS
  24.  
  25. ; LEFT SHIFT UNTIL SPECIFIED NUMBER OF BITS LEFT
  26. ; THEN SHIFT EACH BIT INTO CARRY & SOUND DURATION BASED ON CARRY
  27.  
  28.  
  29. ;MORSE
  30.     CLR    INT_EN        ;INTS OFF
  31.  
  32.     MOV     DPTR,#CODE_TBL
  33.     MOVC    A,@A+DPTR
  34.  
  35. CASE1   ; IF (B7=0) AND (B6=0) {3: RLC A + 5: CALL SEND}
  36.  
  37.     JB      ACC7,CASE2
  38.     JB      ACC6,CASE2
  39.     RLC     A
  40.     RLC     A
  41.     RLC     A
  42.     LCALL   SEND
  43.     LCALL   ELEM_DLY
  44.     LCALL   SEND
  45.     LCALL   ELEM_DLY
  46.     LCALL   SEND
  47.     LCALL   ELEM_DLY
  48.     LCALL   SEND
  49.     LCALL   ELEM_DLY
  50.     LCALL   SEND
  51.     LCALL   CHAR_DLY
  52.     LJMP    M_EXIT
  53.  
  54. CASE2   ; IF (B7=0) AND (B6=1) {2: RLC A + 6: CALL SEND}
  55.     
  56.     JB      ACC7,CASE3
  57.     JNB     ACC6,CASE3
  58.     RLC     A
  59.     RLC     A
  60.     LCALL   SEND
  61.     LCALL   ELEM_DLY
  62.     LCALL   SEND
  63.     LCALL   ELEM_DLY
  64.     LCALL   SEND
  65.     LCALL   ELEM_DLY
  66.     LCALL   SEND
  67.     LCALL   ELEM_DLY
  68.     LCALL   SEND
  69.     LCALL   ELEM_DLY
  70.     LCALL   SEND
  71.     LCALL   CHAR_DLY
  72.     LJMP    M_EXIT
  73.  
  74. CASE3   ; IF (B7=1) AND (B6=0) AND (B5=0) {7: RLC A + 1: CALL SEND}
  75.  
  76.     JNB     ACC7,CASE4
  77.     JB      ACC5,CASE4
  78.     JB      ACC6,CASE4
  79.     RLC     A
  80.     RLC     A
  81.     RLC     A
  82.     RLC     A
  83.     RLC     A
  84.     RLC     A
  85.     RLC     A
  86.     LCALL   SEND
  87.     LCALL   CHAR_DLY
  88.     LJMP    M_EXIT
  89.  
  90. CASE4   ; IF (B7=1) AND (B6=0) AND (B5=1) {6: RLC A + 2: CALL SEND}
  91.  
  92.     JNB     ACC7,CASE5
  93.     JB      ACC6,CASE5
  94.     JNB     ACC5,CASE5
  95.     RLC     A
  96.     RLC     A
  97.     RLC     A
  98.     RLC     A
  99.     RLC     A
  100.     RLC     A
  101.     LCALL   SEND
  102.     LCALL   ELEM_DLY
  103.     LCALL   SEND
  104.     LCALL   CHAR_DLY
  105.     LJMP    M_EXIT
  106.  
  107. CASE5   ; IF (B7=1) AND (B6=1) AND (B5=0) {5: RLC A + 3: CALL SEND}
  108.  
  109.     JNB     ACC7,CASE6
  110.     JNB     ACC6,CASE6
  111.     JB      ACC5,CASE6
  112.     RLC     A
  113.     RLC     A
  114.     RLC     A
  115.     RLC     A
  116.     RLC     A
  117.     LCALL   SEND
  118.     LCALL   ELEM_DLY
  119.     LCALL   SEND
  120.     LCALL   ELEM_DLY
  121.     LCALL   SEND
  122.     LCALL   CHAR_DLY
  123.     LJMP    M_EXIT
  124.  
  125. CASE6   ; IF (B7=1) AND (B6=1) AND (B5=1) {4: RLC A + 4: CALL SEND}
  126.  
  127.     JNB     ACC7,CASE0
  128.     JNB     ACC6,CASE0
  129.     JNB     ACC5,CASE0
  130.     RLC     A
  131.     RLC     A
  132.     RLC     A
  133.     RLC     A
  134.     LCALL   SEND
  135.     LCALL   ELEM_DLY
  136.     LCALL   SEND
  137.     LCALL   ELEM_DLY
  138.     LCALL   SEND
  139.     LCALL   ELEM_DLY
  140.     LCALL   SEND
  141.     LCALL   CHAR_DLY
  142.     LJMP    M_EXIT
  143.  
  144. CASE0   
  145.     LJMP    M_EXIT        ;ERROR HERE; SHOULD NEVER BE CASE 0
  146.  
  147. M_EXIT    SETB    INT_EN
  148.     RET            ; END MORSE
  149.  
  150. ;*******************************************************************
  151. ;
  152. ; SEND SUBROUTINE
  153. ;
  154. ; INPUT IN A. RLC ONE BIT ON EXIT.
  155. ; ALSO MODIFIES R5, R6, R7
  156. ;
  157.  
  158. SEND    
  159.     RLC     A           ; PUT BIT TO SEND IN CARRY!
  160.     JNC    DIT_TONE    ; SEND returns at DIT_TONE
  161.     LJMP    DAH_TONE    ;  or  returns at DAH_TONE
  162.  
  163. ;
  164. ; DIT DELAY
  165. ; Unit element.
  166. ; See page 19-4 of 1994 ARRL HANDBOOK.
  167. ;
  168. ; PARIS word length = 50 units
  169. ; Includes: 
  170. ;   Space between words of 7 units.  
  171. ;   Space btw elements is 1 unit.
  172. ;   Space btw characters is 3 units.
  173. ;
  174. ; Speed (wpm) = (#dots/min)/25
  175. ; 2 * (#dots/min) = #units/min
  176. ; #dots/min = #units/(2min)
  177. ; Speed (wpm) = (#units/min)/50
  178. ; min = 60sec
  179. ; Speed (wpm) * 50 = (#units/min)
  180. ; Speed (wpm) * 50/60 = (#units/sec)
  181. ; Unit time = sec/#units
  182. ; Speed (wpm) * 50/60 = 1/(Unit time)
  183. ; Unit time = 1/(Speed (wpm) * 50/60)
  184. ; Unit time (mS) = (Unit time)*1000; 
  185. ; Unit time (mS) = 1000/(Speed (wpm) * 50/60)
  186. ;
  187. ; Unit time (mS) = 1200/(Speed (wpm))
  188. ; Speed (wpm) = 1200/(Unit time (mS))
  189. ;
  190. ; Min Speed (wpm) = 255mS Unit time => (1200/0.255) = 4.7 wpm.
  191. ; Max Speed (wpm) =  20mS Unit time => (1200/0.020) =  60 wpm.
  192. ;
  193. ; Could reduce both min & max by letting fspd & cspd durations
  194. ; represent 2mS increments instead of 1mS increments...this is
  195. ; necessary for c=2.4wpm for 5@16
  196. ;
  197. ; Farnsworth timing sends elements (dots,dashes) at a specified
  198. ; faster speed (f), then increases the delay between characters (c)
  199. ; to slow the effective rate (to s).  Specify both f and s speeds.
  200. ; The actual slowed rate must be calculated (c_speed).
  201. ;
  202. ; Using PARIS as the benchmark, 
  203. ; (4*3)+7=19 units are sent at c_speed,
  204. ; so 31 units are sent as f_speed.
  205. ;
  206. ; s = (f*31 + c*19)/50
  207. ; c = (s*50 - f*31)/19
  208. ; where f,s,c are in mS
  209. ;
  210. ;         5@16         13@18              20@23
  211. ; f: 16   wpm =  75mS/dit | 18 wpm = 67mS/dit  | 23 wpm = 52mS/dit
  212. ; s:  5   wpm = 240mS/dit | 13 wpm = 92mS/dit  | 20 wpm = 60mS/dit
  213. ; c:  2.4 wpm = 509mS/dit |  9 wpm = 132mS/dit | 16 wpm = 73mS/dit
  214. ;
  215. ; 16wpm elements,  5wpm rate -> f=16, s=05, c= 2.4  (DEFAULT)
  216. ; 18wpm elements, 13wpm rate -> f=18, s=13, c= 9
  217. ; 23wpm elements, 20wpm rate -> f=23, s=20, c= 16
  218. ;
  219. ; CODEX word length = 60 units.
  220. ;
  221.  
  222. ;*******************************************************************
  223. ;
  224. ; DIT_TONE
  225. ;
  226.  
  227. DIT_TONE
  228.  
  229. ;
  230. ; SINE WAVE VERSION
  231. ;
  232.  
  233.     MOV    DUR,FSPD
  234. DIT2    
  235.     ACALL    SINE_CYC
  236.  
  237.     DJNZ    DUR,DIT2
  238.     MOV    P1,#DC
  239.     RET
  240.  
  241. ;*******************************************************************
  242. ;
  243. ; DAH_TONE = 3 * DIT
  244. ;
  245.  
  246. DAH_TONE
  247.  
  248.     MOV    R7,#3        
  249. DAH_LOOP    
  250.     MOV    DUR,FSPD
  251. DAH2
  252.     ACALL    SINE_CYC
  253.  
  254.     DJNZ    DUR,DAH2
  255.  
  256.     DJNZ    R7,DAH_LOOP
  257.  
  258.     MOV    P1,#DC
  259.     RET
  260.  
  261. ;*******************************************************************
  262. ; ELEMENT DELAY
  263. ;
  264.  
  265. ELEM_DLY
  266.     MOV     R7,FSPD
  267.     LCALL   DELAY
  268.     RET
  269.  
  270. ;*******************************************************************
  271. ;
  272. ; CHARACTER DELAY
  273. ;
  274.  
  275. CHAR_DLY
  276.     MOV    R5,#3
  277. CD_LOOP
  278.     MOV     R7,CSPD
  279.     LCALL   DELAY2
  280.     DJNZ    R5,CD_LOOP
  281.     RET
  282.  
  283. ;*******************************************************************
  284. ;
  285. ; WORD DELAY
  286. ;
  287.  
  288. WORD_DLY
  289.     MOV    R5,#7
  290. WD_LOOP
  291.     MOV     R7,CSPD
  292.     LCALL   DELAY2
  293.     DJNZ    R5,WD_LOOP
  294.     RET
  295.  
  296. ;*******************************************************************
  297. ;
  298. ; DELAY FOR R7 number of mS
  299. ; Modifies R6, R7
  300. ;
  301.  
  302. DELAY
  303. D_LOOP
  304.     MOV     R6,#ONE_MS      ; USE R6 FOR DELAY SCRATCH 
  305.     DJNZ    R6,$
  306.     DJNZ    R7,D_LOOP
  307.     RET
  308.  
  309. ;*******************************************************************
  310. ;
  311. ; DELAY FOR (R7 * 2) number of mS
  312. ; Used for CSPD Delays since they exceed 255 max mS count
  313. ; for R7 input to DELAY 
  314. ; Modifies R6, R7
  315. ;
  316.  
  317. DELAY2
  318. D_LOOP2
  319.     MOV     R6,#ONE_MS      ; USE R6 FOR DELAY SCRATCH 
  320.     DJNZ    R6,$
  321.     MOV     R6,#ONE_MS      ; USE R6 FOR DELAY SCRATCH 
  322.     DJNZ    R6,$
  323.     DJNZ    R7,D_LOOP2
  324.     RET
  325.  
  326. ;*******************************************************************
  327. ;
  328. ; SINE_CYC
  329. ;
  330. ; 500 Hz single cycle.  1/8 mS per step.  500 Hz -> 2 mS period.
  331. ; 2 mS / (1/8 mS / step) = 16 steps
  332. ;
  333.  
  334. SINE_CYC
  335.     MOV    P1,#S0
  336.     MOV    R6,#EIGTH_MS
  337.     DJNZ    R6,$
  338.  
  339.     MOV    P1,#S1
  340.     MOV    R6,#EIGTH_MS
  341.     DJNZ    R6,$
  342.  
  343.     MOV    P1,#S2
  344.     MOV    R6,#EIGTH_MS
  345.     DJNZ    R6,$
  346.  
  347.     MOV    P1,#S3
  348.     MOV    R6,#EIGTH_MS
  349.     DJNZ    R6,$
  350.  
  351.     MOV    P1,#S4
  352.     MOV    R6,#EIGTH_MS
  353.     DJNZ    R6,$
  354.  
  355.     MOV    P1,#S5
  356.     MOV    R6,#EIGTH_MS
  357.     DJNZ    R6,$
  358.  
  359.     MOV    P1,#S6
  360.     MOV    R6,#EIGTH_MS
  361.     DJNZ    R6,$
  362.  
  363.     MOV    P1,#S7
  364.     MOV    R6,#EIGTH_MS
  365.     DJNZ    R6,$
  366.  
  367.     MOV    P1,#S8
  368.     MOV    R6,#EIGTH_MS
  369.     DJNZ    R6,$
  370.  
  371.     MOV    P1,#S9
  372.     MOV    R6,#EIGTH_MS
  373.     DJNZ    R6,$
  374.  
  375.     MOV    P1,#S10
  376.     MOV    R6,#EIGTH_MS
  377.     DJNZ    R6,$
  378.  
  379.     MOV    P1,#S11
  380.     MOV    R6,#EIGTH_MS
  381.     DJNZ    R6,$
  382.  
  383.     MOV    P1,#S12
  384.     MOV    R6,#EIGTH_MS
  385.     DJNZ    R6,$
  386.  
  387.     MOV    P1,#S13
  388.     MOV    R6,#EIGTH_MS
  389.     DJNZ    R6,$
  390.  
  391.     MOV    P1,#S14
  392.     MOV    R6,#EIGTH_MS
  393.     DJNZ    R6,$
  394.  
  395.     MOV    P1,#S15
  396.     MOV    R6,#EIGTH_MS
  397.     DJNZ    R6,$
  398.  
  399.     RET                ; END SINE_CYC
  400.  
  401.     NOP
  402.     
  403.